EC2 Instance Connect Endpoint 를 이용해서 Private EC2에 접속하기
안녕하세요 클래스메소드의 수재입니다.
환경을 구축한 후 당초와는 다르게 외부에서 프라이빗 EC2에 액세스를 할 수 있게 만들어야 하는 경우가 간혹 있습니다.
그런 상황에서 다양한 선택지가 있지만 가장 영향이 적은 방법은 개인적으로 EC2 Instance Connect Endpoint(이하 EICE)라고 생각합니다.
이번 글에서는 EICE가 무엇인지 그리고 어떻게 설정하는지에 대해 확인해보도록 하겠습니다.
EICE란?
EICE를 설명하기 전에 우선 EC2 Instance Connect에 대해 먼저 알아볼 필요가 있습니다.
EC2 Instance Connect는 IAM 권한으로 액세스를 제어할 수 있으며 필요하다면 1회용 SSH 키도 발급할 수 있는 기능입니다.
기능 자체는 2019년에 공개되었습니다.
비슷한 기능으로 AWS Systems Manager Session Manager(이하 Session Manager)가 있습니다.
Session Manager가 실제로 SSH를 사용한 접근이 아니라 유사 로그인1이라면 EC2 Instance Connect는 SSH를 이용하여 실제로 액세스가 가능합니다.
다만 Session Manager는 Privatelink등을 이용하여 프라이빗 EC2에 접속이 가능하지만 Instance Connect를 이용하는 경우에는 EC2에 퍼블릭 IP가 필요합니다. 즉 퍼블릭 EC2가 되어야합니다.
퍼블릭 EC2에만 사용할 수 있다는 단점을 개선한 것이 EC2 Instance Connect Endpoint 입니다.
구성은 EC2 앞에 액세스를 위한 엔드포인트가 있으며 유저는 이 엔드포인트에 접속하여 EC2에 연결하는 방식입니다.
EC2와 별도의 보안 그룹을 엔드포인트에 적용할 수 있으며 EC2에 연결된 보안 그룹의 인바운드 규칙에는 엔드포인트의 보안 그룹만 허용하도록 하여 보안을 강화할 수 있습니다.
이를 이미지로 하면 다음과 같습니다.(출처)
이외의 장점으로는 SSM Session Manager와 달리 EC2 인스턴스 프로파일에서 전용 작업을 허용할 필요가 없다는 점, 별도의 에이전트를 EC2에 인스톨 할 필요가 없다는 점, 기능 이용 자체에는 비용이 발생하지 않는 점 등이 있습니다.
물론 EICE를 작성 및 삭제하기 위한 IAM 권한은 필요합니다.
EICE를 이용할 때 고려할 점으로는
- 포트 22 및 3389만 지원
- 즉 RDS에 접근하기 위해 포트 포워딩하는 것은 지원하지 않습니다
- 각 EC2 인스턴스 연결 엔드포인트는 최대 20개의 동시 연결을 지원
- 대용량 데이터 전송이 제한
서비스의 상한은 다음과 같습니다.
- 동일 계정에서 AWS 리전 당 5개
- VPC 당 1개
- 서브넷 당 1개
프라이빗 EC2에 접속하는 방법들
2024년 4월 기준으로 프라이빗 EC2에 접속하는 방법을 간단히 정리해보자면 다음과 같습니다.2
배스천 호스트(Bastion Host) | Session Manager | EICE | |
---|---|---|---|
개요 | 퍼블릭 서브넷에 EC2를 배치하여 이 EC2를 경유하여 프라이빗 EC2에 접속 | Systems Manager 에서 제공하는 Session Manager를 이용하여 접속 | EICE 기능을 이용하여 접속 |
장점 | - SSH/RDP 이외에 포트 포워딩도 가능 - 필요에 맞추어 배스천 호스트 EC2의 조작이 가능 | - IAM 권한을 이용하여 액세스 컨트롤 가능 - 별도의 보안그룹 설정이 불필요 | - 프라이빗 EC2에 접속하기 위해 엔드포인트 이외의 조작은 불필요 |
단점 | - 패치 관리, 관리 및 감사에 따른 운영 오버헤드 발생 - 배스천 호스트 EC2 자체의 비용 발생 | - 에이전트의 인스톨이 필요 - Privatelink 등 별도의 비용 발생 - SSH 로그인이 아님 | - 포트 포워딩 불가능 |
비용3 | EC2 자체의 비용 발생 | 기능 자체는 무료지만 Privatelink 비용 발생 | 무료 |
사용해보기
사용 방법은 간단합니다.
우선 AWS 콘솔 VPC - 보안 그룹 - 보안 그룹 생성으로 접속하여 엔드포인트용 보안 그룹을 생성합니다.
생성 할 때 EC2가 있는 VPC가 지정되어야 합니다.
이어서 VPC - 엔드포인트 - 엔드포인트 생성으로 접속하여 엔드포인트를 생성합니다.
목표 EC2와 동일한 VPC나 서브넷에 엔드포인트를 배치할 필요는 없습니다.
다만 클라이언트 IP 보존4을 활성화 하는 경우에는 동일한 VPC에 엔드포인트를 생성해야합니다.
보안 그룹을 지정하지 않으면 VPC의 기본 보안 그룹이 설정됩니다.
마지막으로 EC2 콘솔에서 프라이빗 EC2를 클릭하여 연결을 클릭합니다. 방금 생성한 엔드포인트를 지정합니다. 그리고 연결을 클릭하면 AWS 콘솔에서 SSH 접속이 된 것을 확인할 수 있습니다.
프롬프트로 접속하고 싶은 경우
SSH 및 AWS CLI를 이용하여 프롬프트에서 접속하는 것도 가능합니다.
$ ssh -i my-key-pair.pem ec2-user@i-0123456789example \ -o ProxyCommand='aws ec2-instance-connect open-tunnel --instance-id i-0123456789example'
RDP는 다음과 같습니다
aws ec2-instance-connect open-tunnel \ --instance-id i-0123456789example \ --remote-port 3389 \ --local-port any-port
보안 그룹에 대해
위에 기재되어 있듯이 엔드포인트와 인스턴스 각각에 보안 그룹이 연결됩니다.
엔드포인트의 보안 그룹에 인바운드 규칙은 아무것도 지정하지 않아도 문제 없습니다.
보안을 강화하기 위해서는 아웃바운드 규칙에 EC2에 연결된 보안그룹으로의 22/3389 포트만을 개방하는 것을 추천드립니다.
EC2에 연결되어 있는 보안그룹의 인바운드 규칙에는 엔드포인트 보안 그룹으로부터 22/3389 포트를 개방할 필요가 있습니다.
인바운드 규칙이 설정되어 있지 않다면 연결이 실패합니다.
마무리
예전만큼 프라이빗 EC2 접속에 대해 부담을 가지지 않아도 된다는 점에 다행이라고 생각합니다.
공개된지는 거의 1년이 다 되어 가는 서비스이지만 아직 배스천 호스트를 채택하는 경우가 많기에 이 글이 도움이 되었으면 좋겠습니다.
긴 글 읽어주셔서 감사합니다.
오탈자 및 내용 피드백은 must01940 지메일로 보내주시면 감사합니다.